【oracle】重置序列的当前值 - zhouzhou423的专栏 - CSDN博客

创建时间:2018/10/18 9:42
来源:https://blog.csdn.net/zhouzhou423/article/details/39251609

oracle的序列重置值有两种方法:

假设现有表 T_test 对应主键的sequence为seq_test_id
 
方法一:重建sequence:
删除序列seq_test_id,然后重新新建序列seq_test_id,将新序列seq_test_id的start with值改为一个合适的num,可以直接使用下面这个函数来实现。

  1. 1
    create or replace function SF_SET_SEQ_NEXTVAL(vcSeqName in varchar2, lNextVal in number) return number is
  2. 2
    /* ===========================================================================
  3. 3
    * 函 数 名:sf_set_seq_nextval
  4. 4
    *
  5. 5
    * 用 途:将SEQUENCE设置成下一个值
  6. 6
    *
  7. 7
    * ===========================================================================
  8. 8
    */
  9. 9
  10. 10
    Result number;
  11. 11
    lMinVal number;
  12. 12
    lMaxVal number;
  13. 13
    lIncVal number;
  14. 14
    cCycle char(1);
  15. 15
    cOrder char(1);
  16. 16
    lCache number;
  17. 17
    sCycle varchar2(10);
  18. 18
    sOrder varchar2(10);
  19. 19
    sCache varchar2(10);
  20. 20
    sTemp varchar2(300);
  21. 21
    begin
  22. 22
    Result := 0;
  23. 23
    lMinVal := 0;
  24. 24
    lMaxVal := 0;
  25. 25
    lIncVal := 0;
  26. 26
    cCycle := 'N';
  27. 27
    cOrder := 'N';
  28. 28
    lCache := 0;
  29. 29
    sCycle := 'nocycle';
  30. 30
    sOrder := 'noorder';
  31. 31
    sCache := 'nocache';
  32. 32
    sTemp := '';
  33. 33
  34. 34
    select u.increment_by, u.min_value, u.max_value,
  35. 35
    u.cycle_flag, u.order_flag, u.cache_size
  36. 36
    into lIncVal, lMinVal, lMaxVal, cCycle, cOrder, lCache
  37. 37
    from user_sequences u
  38. 38
    where u.sequence_name = upper(vcSeqName);
  39. 39
  40. 40
    if cCycle = 'N' then sCycle := 'nocycle'; else sCycle := 'cycle'; end if;
  41. 41
    if cOrder = 'N' then sOrder := 'noorder'; else sOrder := 'order'; end if;
  42. 42
    if lCache <= 0 then
  43. 43
    sCache := 'nocache';
  44. 44
    else
  45. 45
    sCache := 'cache '||lCache;
  46. 46
    end if;
  47. 47
  48. 48
    -- 删除SEQ
  49. 49
    sTemp := 'drop sequence '||vcSeqName;
  50. 50
    Execute immediate sTemp;
  51. 51
  52. 52
    -- 重建SEQ
  53. 53
    sTemp := 'create sequence '||vcSeqName||
  54. 54
    ' minvalue '||lMinVal||
  55. 55
    ' maxvalue '||lMaxVal||
  56. 56
    ' start with '||lNextVal||
  57. 57
    ' increment by '||lIncVal||
  58. 58
    ' '||sCycle||' '||sOrder||' '||sCache||'';
  59. 59
    Execute immediate sTemp;
  60. 60
  61. 61
    Result := 0;
  62. 62
    return(Result);
  63. 63
    end SF_SET_SEQ_NEXTVAL;
  64. 64

方法二:设置increment参数值
通过设置sequence的increment参数值,加上一个负数/正数,以达到修改sequence的值目的,修改完之后再将increment参数值恢复。
执行如下sql:

  1. 1
    declare
  2. 2
    n NUMBER(10);
  3. 3
    tsql VARCHAR2(100);
  4. 4
    p_seqName varchar2(20);
  5. 5
    begin
  6. 6
    --重置委托号sequence
  7. 7
    p_seqName := 'SEQENTRUSTNO';--修改这里的sequence名称
  8. 8
    EXECUTE IMMEDIATE 'SELECT ' || p_seqName || '.NEXTVAL FROM dual ' INTO n;
  9. 9
    n := - (n-1); --这里是要恢复到1
  10. 10
    tsql := 'alter sequence '|| p_seqName ||' increment by ' || n; --修改increment参数
  11. 11
    EXECUTE IMMEDIATE tsql;
  12. 12
    EXECUTE IMMEDIATE 'SELECT ' || p_seqName || '.NEXTVAL FROM dual ' INTO n;
  13. 13
    tsql := 'alter sequence '|| p_seqName ||' increment by 1' ; --恢复increment参数值
  14. 14
    EXECUTE IMMEDIATE tsql;
  15. 15
    end;
  16. 16
    /
  17. 17